package com.magina.calendario;

/**
 * Created by IntelliJ IDEA.
 * User: marcioat
 * Date: 23/05/11
 * Time: 01:28
 */

import android.content.*;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.provider.BaseColumns;

import java.util.HashMap;


public class EventoProvider extends ContentProvider
{


	// Authority do nosso provider, a ser usado nas Uris.
	public static final String AUTHORITY = "com.magina.calendario.EventoProvider";

	// Nome do arquivo que ira conter o banco de dados.
	private static  final String DATABASE_NAME = "dbmag000.db";

	// Versao do banco de dados.
	// Este valor e importante pois e usado em futuros updates do DB.
	private static  final int  DATABASE_VERSION = 3;

	// Nome da tabela que ira conter as anotacaes.
	private static final  String EVENTO_TABLE = "evento";

	// 'Id' da Uri referente as notas do usuario.
	private  static final int EVENTO = 3;

	// Instancia da classe utilitaria
	private DBHelper mHelper;

	// Uri matcher - usado para extrair informacoes das Uris
    private static final UriMatcher mMatcher;

    private static HashMap<String, String> mProjection;

    static {
		mProjection = new HashMap<String, String>();
		mProjection.put(Evento.NOTE_ID, Evento.NOTE_ID);
		mProjection.put(Evento.TEXT, Evento.TEXT);
        mProjection.put(Evento.DATA_EVE, Evento.DATA_EVE);
    }

    static {
    	mMatcher = new UriMatcher(UriMatcher.NO_MATCH);
		mMatcher.addURI(AUTHORITY, EVENTO_TABLE, EVENTO);
    }


	/////////////////////////////////////////////////////////////////
	//           Metodos overrided de ContentProvider              //
	/////////////////////////////////////////////////////////////////
	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
        SQLiteDatabase db = mHelper.getWritableDatabase();
        int count;
        switch (mMatcher.match(uri)) {
        	case EVENTO:
                count = db.delete(EVENTO_TABLE, selection, selectionArgs);
                break;
            default:
                throw new IllegalArgumentException("URI desconhecida " + uri);
        }

        getContext().getContentResolver().notifyChange(uri, null);
        return count;
	}

	@Override
	public String getType(Uri uri) {
	        switch (mMatcher.match(uri)) {
	            case EVENTO:
	                return Evento.CONTENT_TYPE;
	            default:
	                throw new IllegalArgumentException("URI desconhecida " + uri);
	        }
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
        switch (mMatcher.match(uri)) {
	    	case EVENTO:
		        SQLiteDatabase db = mHelper.getWritableDatabase();
		        long rowId = db.insert(EVENTO_TABLE, Evento.TEXT, values);
		        if (rowId > 0) {
		            Uri noteUri = ContentUris.withAppendedId(Evento.CONTENT_URI, rowId);
		            getContext().getContentResolver().notifyChange(noteUri, null);
		            return noteUri;
		        }
	        default:
	            throw new IllegalArgumentException("URI desconhecida " + uri);
        }
	}

	@Override
	public boolean onCreate() {
		mHelper = new DBHelper(getContext());
		return true;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
			// Aqui usaremos o SQLiteQueryBuilder para construir
			// a query que sera feito ao DB, retornando um cursor
			// que enviaremos e aplicacao.
	        SQLiteQueryBuilder builder = new  SQLiteQueryBuilder();
	        SQLiteDatabase database = mHelper.getReadableDatabase();
	        Cursor cursor;
	        switch (mMatcher.match(uri)) {
	            case EVENTO:
	            	// O Builer recebera dois parametros: a tabela
	            	// onde sera feita a busca, e uma projection -
	            	// que nada mais e que uma HashMap com os campos
	            	// que queremos recuperar do banco de dados.
	                builder.setTables(EVENTO_TABLE);
	                builder.setProjectionMap(mProjection);
	                break;

	            default:
	                throw new IllegalArgumentException("URI desconhecida " + uri);
	        }

	        cursor = builder.query(database, projection, selection,
	        		                 selectionArgs, null, null, sortOrder);
	        cursor.setNotificationUri(getContext().getContentResolver(), uri);
	        return cursor;
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
	        SQLiteDatabase db = mHelper.getWritableDatabase();
	        int count;
	        switch (mMatcher.match(uri)) {
	            case EVENTO:
	                count = db.update(EVENTO_TABLE, values, selection, selectionArgs);
	                break;
	            default:
	                throw new IllegalArgumentException("URI desconhecida " + uri);
	        }

	        getContext().getContentResolver().notifyChange(uri, null);
	        return count;
	}

	/////////////////////////////////////////////////////////////////
	//                Inner Classes utilitarias                    //
	/////////////////////////////////////////////////////////////////
    public static final class Evento implements  BaseColumns {
        public static final Uri CONTENT_URI = Uri.parse("content://"
	                + EventoProvider.AUTHORITY + "/evento");

        public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.magina.evento";

        public static final String NOTE_ID = "_id";
        public static final String TEXT = "Nom_Evento";
        public static final String DATA_EVE = "Dat_Evento";
    }

    private static class DBHelper extends SQLiteOpenHelper {

        DBHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        /* O metodo onCreate e chamado quando o provider e executado pela
         * primeira vez, e usado para criar as tabelas no database
         */
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL("CREATE TABLE " + EVENTO_TABLE + " (" +
            		Evento.NOTE_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
            		Evento.TEXT + " TEXT," +
                    Evento.DATA_EVE + " INTEGER);");
        }

        /* O metodo onUpdate e invocado quando a versao do banco de dados
         * muda. Assim, e usado para fazer adequacoes para a aplicacao
         * funcionar corretamente.
         */
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            try
            {
            db.execSQL("DROP TABLE " + EVENTO_TABLE + ";");
            }
            catch(Exception ignored){}
            this.onCreate(db);
        }
    }
}

